/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.gpstracking.DA;

import com.gpstracking.BE.*;

import java.util.*;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author jmj
 */
public class NotificacionDA {

    

   
    public static void save(Notificacion notificacion) {
        Session hbsession = HUtil.getSession();
        Transaction tx = hbsession.beginTransaction();
        tx.begin();
        
        hbsession.save( notificacion);
        
        tx.commit();
                
        
    }

    public static boolean save(Notificacion notificacion, List<Condicion> condiciones , List<Dispositivo> dispositivos ) {
        Session hbsession = null;
        try{
        	hbsession = HUtil.getSessionFactory().openSession();
	        
	        Transaction tx = hbsession.beginTransaction();
	        tx.begin();
	        
	        hbsession.save( notificacion );
	        for( Condicion condicion : condiciones){
	            NotificacionCondicionId id = new NotificacionCondicionId( notificacion.getIdNotificacion() , condicion.getIdCondicion() );
	            NotificacionCondicion notificacionCondicion = new NotificacionCondicion();
	            notificacionCondicion.setId(id);
	            notificacionCondicion.setHabilitado(true);
	            notificacionCondicion.setCondicion(condicion);
	            notificacionCondicion.setNotificacion(notificacion);
	            
	            hbsession.save( notificacionCondicion) ;
	           
	        }
	        for(Dispositivo dispositivo : dispositivos){
	        	NotificacionDispositivoId id = new NotificacionDispositivoId( notificacion.getIdNotificacion() , dispositivo.getIdDispositivo() );
	            NotificacionDispositivo notificacionDispositivo = new NotificacionDispositivo();
	            notificacionDispositivo.setId(id);
	            notificacionDispositivo.setDescripcion("STH");//FIX
	            notificacionDispositivo.setDispositivo(dispositivo);
	            notificacionDispositivo.setNotificacion(notificacion);
	            
	            hbsession.save( notificacionDispositivo) ;
	        	
	        }
	        
	        tx.commit();
	        
	        return true;
        }catch(Exception ex){
        	ex.printStackTrace();
        	return false;
        	
        }
    
    }

	public static List<Notificacion> getNotificacionesActivas( Usuario usuario ) {
		Session hbsession = HUtil.getSession();
		Transaction tx = hbsession.beginTransaction();
		tx.begin();
        Query query = hbsession.createQuery("FROM Notificacion WHERE usuario.idUsuario = :iduser");
        query.setParameter( "iduser", usuario.getIdUsuario());
        List<Notificacion> res = (List<Notificacion>) query.list();
       
        return res;
	}

	
	public static List<NotificacionCondicion> getCondiciones(Notificacion notificacion) {
		
		Session hbsession = HUtil.getSession();
		Transaction tx = hbsession.beginTransaction();
		tx.begin();
        Query query = hbsession.createQuery("FROM NotificacionCondicion WHERE notificacion.idNotificacion = " + notificacion.getIdNotificacion() );
        System.out.println( "FROM NotificacionCondicion WHERE notificacion.idNotificacion = " + notificacion.getIdNotificacion()  );
        List<NotificacionCondicion> res = (List<NotificacionCondicion>) query.list();
		
		return res;
	}

	public static NotificacionCondicion get(Notificacion notificacion,	Condicion condicion) {
		
		Session hbsession = HUtil.getSession();
		Transaction tx = hbsession.beginTransaction();
		tx.begin();
        Query query = hbsession.createQuery("FROM NotificacionCondicion WHERE notificacion.idNotificacion = :idnotificacion AND condicion.idCondicion = :idcondicion "); 
        		
        query.setParameter( "idnotificacion" , notificacion.getIdNotificacion());
        query.setParameter( "idcondicion" , condicion.getIdCondicion());
        
        List<NotificacionCondicion> res = (List<NotificacionCondicion>) query.list();
		if ( res.isEmpty() ) return null;
		return res.get(0);
	}

	
}
